package com.estate.common.config;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONException;
import org.apache.commons.lang3.StringUtils;

/**
 * JSON数据清理工具类 - 增强版
 */
public class JsonDataCleanUtil {

    /**
     * 清理JSON字段值 - 严格处理空值
     */
    public static String cleanJsonField(String value) {
        if (StringUtils.isBlank(value)) {
            return null;
        }

        // 处理特殊格式
        value = value.trim();

        // 严格处理所有可能的空值格式
        if (isEmptyValue(value)) {
            return null;
        }

        // 验证JSON格式
        if (isValidJson(value)) {
            return value;
        }

        // 尝试修复JSON格式
        String fixedValue = tryFixJson(value);
        if (fixedValue != null && isValidJson(fixedValue)) {
            return fixedValue;
        }

        // 如果无法修复，返回null
        return null;
    }

    /**
     * 检查是否为空值
     */
    private static boolean isEmptyValue(String value) {
        return "[null]".equals(value) ||
                "\"\"".equals(value) ||
                "null".equals(value) ||
                "".equals(value) ||
                "[]".equals(value) ||
                "{}".equals(value);
    }

    /**
     * 验证是否为有效的JSON
     */
    public static boolean isValidJson(String json) {
        if (StringUtils.isBlank(json)) {
            return false;
        }
        try {
            JSON.parse(json);
            return true;
        } catch (JSONException e) {
            return false;
        }
    }

    /**
     * 尝试修复JSON格式
     */
    private static String tryFixJson(String value) {
        // 移除外层的多余引号
        if (value.startsWith("\"") && value.endsWith("\"")) {
            String unquoted = value.substring(1, value.length() - 1);
            // 如果去掉引号后是有效的JSON，使用去掉引号的值
            if (isValidJson(unquoted)) {
                return unquoted;
            }
        }

        // 处理转义字符
        value = value.replace("\\\"", "\"");

        // 再次验证
        if (isValidJson(value)) {
            return value;
        }

        // 如果无法修复，返回null
        return null;
    }
}